Amazon RDSとAmazon AuroraのストレージエンジンにMyISAMを指定してみる
いわさです。
MySQL5.5よりも前のバージョンではMyISAMがデフォルトのストレージエンジンでした。
MySQLには様々なストレージエンジンが用意されており、現在デフォルトで選択されるのはInnoDBとなっており、特別なユースケースに該当しない限りはInnoDBを使うことが推奨されています。
Amazon RDSでもデフォルトのストレージエンジンはInnoDBとなっており、そしてMyISAMの利用は非推奨とされています。
以下によれば、MyISAMの場合クラッシュ回復時の信頼性の問題やリードレプリカで意図した動作をしない場合があるとされています。
また、Amazon AuroraではMyISAMは使用できない、とされています。
上記をまとめると、非推奨だがRDSでは一応利用が可能。Auroraでは利用は出来ない。と読み取れます。
今回は実際にMyISAMをRDSやAuroraで指定出来るのか、「使用できない」とはどういうことなのかを確認してみました。
MyISAMの指定方法
CREATE TABLE t1 (i INT) ENGINE = INNODB;
MySQL :: MySQL 5.6 リファレンスマニュアル :: 15.1 ストレージエンジンの設定 より
ストレージエンジンはCREATE TABLE / ALTER TABLE ステートメントでテーブル毎に指定します。
また、ENGINEオプションを省略した場合はdefault-storage-engine
オプションを使用します。
RDSの場合は、DBパラメータグループで指定します。
Amazon RDS for MySQL 8 のパラメータ
デフォルト値にInnoDBが設定されています。
そしてパラメータは変更不可です。
Aurora MySQL 5.7 のパラメータ
DBパラメータグループに項目自体が存在しません。
RDSでMyISAMを指定してみる
ストレージエンジンのサポートステータスを確認
SHOW ENGINES
コマンドで、サーバーでサポートされるストレージエンジンを調べることが出来ます。
RDSに対して実行してみます。
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.08 sec)
MyISAMはSupportがYESなので、サポートされています。
ちなみに、RDSのドキュメントには「FEDERATEDはサポートされていません」との記述がありました。たしかにこの結果からもサポートはされていないようです。
テーブルを作成
パラメータを確認のうえ、テーブルを作成してみます。
ENGINE指定を省略した場合、InnoDBを明示的に指定した場合、MyISAMを明示的に指定した場合の3パターンのテーブルを作成してみます。
mysql> SHOW VARIABLES like '%storage%'; +---------------------------------+-----------+ | Variable_name | Value | +---------------------------------+-----------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_mem_storage_engine | TempTable | +---------------------------------+-----------+ 4 rows in set (0.05 sec) mysql> CREATE TABLE t_default (i INTEGER); Query OK, 0 rows affected (0.06 sec) mysql> CREATE TABLE t_inno (i INT) ENGINE = InnoDB; Query OK, 0 rows affected (0.05 sec) mysql> CREATE TABLE t_myisam (i INT) ENGINE = MyISAM; Query OK, 0 rows affected (0.06 sec) mysql> select table_schema, table_name, engine from information_schema.tables where table_schema = 'hoge'; +--------------+------------+--------+ | TABLE_SCHEMA | TABLE_NAME | ENGINE | +--------------+------------+--------+ | hoge | t_default | InnoDB | | hoge | t_inno | InnoDB | | hoge | t_myisam | MyISAM | +--------------+------------+--------+ 3 rows in set (0.07 sec)
デフォルトはInnoDBで作成されました。
そして明示的に指定した場合は、MyISAMも作成が出来ました。
パラメータを変更して作成
default_storage_engine
を変更してみます。
DBパラメータグループからは変更不可となっていたので、セッション内でSETコマンドを使います。
そして、同じ用にテーブルを3パターン作成してみましょう。
mysql> SET default_storage_engine = MyISAM; Query OK, 0 rows affected (0.06 sec) mysql> SHOW VARIABLES like '%storage%'; +---------------------------------+-----------+ | Variable_name | Value | +---------------------------------+-----------+ | default_storage_engine | MyISAM | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_mem_storage_engine | TempTable | +---------------------------------+-----------+ 4 rows in set (0.07 sec) mysql> CREATE TABLE t_default (i INTEGER); Query OK, 0 rows affected (0.10 sec) mysql> CREATE TABLE t_inno (i INT) ENGINE = InnoDB; Query OK, 0 rows affected (0.08 sec) mysql> CREATE TABLE t_myisam (i INT) ENGINE = MyISAM; Query OK, 0 rows affected (0.05 sec) mysql> select table_schema, table_name, engine from information_schema.tables where table_schema = 'hoge2'; +--------------+------------+--------+ | TABLE_SCHEMA | TABLE_NAME | ENGINE | +--------------+------------+--------+ | hoge2 | t_default | MyISAM | | hoge2 | t_inno | InnoDB | | hoge2 | t_myisam | MyISAM | +--------------+------------+--------+ 3 rows in set (0.05 sec)
デフォルトもMyISAMで作成されました。
default_storage_engine
は有効ですね。
ただし、セッション内でパラメータ変更をしたので、RDSを再起動するとデフォルト値は戻ります。
mysql> SHOW VARIABLES like '%storage%'; ERROR 2013 (HY000): Lost connection to MySQL server during query No connection. Trying to reconnect... Connection id: 9 Current database: hoge2 +---------------------------------+-----------+ | Variable_name | Value | +---------------------------------+-----------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | internal_tmp_mem_storage_engine | TempTable | +---------------------------------+-----------+ 4 rows in set (0.47 sec)
AuroraでMyISAMを指定してみる
同じ確認をAuroraでも実施してみます。
ストレージエンジンのサポートステータスを確認
まずはサポートステータスの確認です。
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.03 sec)
サーバーとして、サポート自体はされているようですね。
もしかして、使えるかも?
テーブル作成
実際にテーブルを作成して確認してみましょう。
mysql> SHOW VARIABLES like '%storage%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | ignore_default_storage_engine_errors | OFF | | internal_tmp_disk_storage_engine | InnoDB | +--------------------------------------+--------+ 5 rows in set (0.09 sec) mysql> CREATE TABLE t_default (i INTEGER); Query OK, 0 rows affected (0.06 sec) mysql> CREATE TABLE t_inno (i INT) ENGINE = InnoDB; Query OK, 0 rows affected (0.05 sec) mysql> CREATE TABLE t_myisam (i INT) ENGINE = MyISAM; Query OK, 0 rows affected, 1 warning (0.05 sec) mysql> select table_schema, table_name, engine from information_schema.tables where table_schema = 'hoge'; +--------------+------------+--------+ | table_schema | table_name | engine | +--------------+------------+--------+ | hoge | t_default | InnoDB | | hoge | t_inno | InnoDB | | hoge | t_myisam | InnoDB | +--------------+------------+--------+ 3 rows in set (0.09 sec)
明示的に指定しましたが、InnoDBで作成されました。
そして、警告が出ています。確認してみましょう。
mysql> show warnings; +-------+------+---------------------------------------------------+ | Level | Code | Message | +-------+------+---------------------------------------------------+ | Note | 1266 | Using storage engine InnoDB for table 't_myisam' | +-------+------+---------------------------------------------------+ 1 row in set (0.09 sec)
MyISAMの指定が無視されて、InnoDBで作成された旨が警告表示されていますね。
AuroraでMyISAMを使用できない、というのはMySQLサーバーとして見た時はサポートされているが、Auroraの挙動としてENGINEパラメータで指定してもInnoDBに置き換える、という挙動を指していることがわかりました。
パラメータ変更
最後に、AuroraのDBパラメータグループで確認出来ませんでしたが、MySQL上は何が設定されているでしょうか。
mysql> SHOW VARIABLES like '%storage%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | | | ignore_default_storage_engine_errors | ON | | internal_tmp_disk_storage_engine | InnoDB | +--------------------------------------+--------+ 5 rows in set (0.06 sec)
こちらは予想どおりInnoDBが設定されていました。
変更は出来るでしょうか。
mysql> SET default_storage_engine = MyISAM; ERROR 1238 (HY000): Variable 'default_storage_engine' is a read only variable
デフォルトストレージエンジンの変更は出来ませんでした。
まとめ
- Amazon RDSでは使えた。
- でもDBパラメータが変更不可になっているので永続的にデフォルトストレージエンジンをMyISAMにするのは難しい。
- CREATE TABLEで明示的な指定が必要。
- やはりAmazon Auroraでは使えなかった。勝手にInnoDBに置き換わる。